//`define SHA2_224
//`define SHA2_256
//`define SHA2_384
//`define SHA2_512
module sha2_proc #(
    parameter MAX_MSG_LEN = 128, // 任意输入消息长度，0-512*7
    parameter MSG_LEN_B =   MAX_MSG_LEN<512 ? 512*1 : //支持0-512*7的数据长度
                            MAX_MSG_LEN>=512*1 && MAX_MSG_LEN<512*2 ? 512*2 :
                            MAX_MSG_LEN>=512*2 && MAX_MSG_LEN<512*3 ? 512*3 :
                            MAX_MSG_LEN>=512*3 && MAX_MSG_LEN<512*4 ? 512*4 :
                            MAX_MSG_LEN>=512*4 && MAX_MSG_LEN<512*5 ? 512*5 :
                            MAX_MSG_LEN>=512*5 && MAX_MSG_LEN<512*6 ? 512*6 :
                            MAX_MSG_LEN>=512*6 && MAX_MSG_LEN<512*7 ? 512*7 : 512,
    parameter MSG_LEN_B1 =  MAX_MSG_LEN<512 ? 512*2 : //支持0-512*7的数据长度
                            MAX_MSG_LEN>=512*1 && MAX_MSG_LEN<512*2 ? 512*3 :
                            MAX_MSG_LEN>=512*2 && MAX_MSG_LEN<512*3 ? 512*4 :
                            MAX_MSG_LEN>=512*3 && MAX_MSG_LEN<512*4 ? 512*5 :
                            MAX_MSG_LEN>=512*4 && MAX_MSG_LEN<512*5 ? 512*6 :
                            MAX_MSG_LEN>=512*5 && MAX_MSG_LEN<512*6 ? 512*7 :
                            MAX_MSG_LEN>=512*6 && MAX_MSG_LEN<512*7 ? 512*8 : 512*2                        
    ) (
    input wire clk,
    input wire rst_n,
    input wire [MAX_MSG_LEN - 1:0] message,
//    input wire [2:0] algo_select, // 算法选择信号
    input wire valid,
//    output reg [MSG_LEN_B - 1:0] message_block, // 足够大的输出宽度
    output  [223:0] digest_224,
    output  [255:0] digest_256,
    output  [383:0] digest_384,
    output  [511:0] digest_512,
    output done
//    output reg valid_out
);

    integer i;
    reg [MSG_LEN_B - 1:0] message_block;//224/256
    wire [511:0] message_block_o;
    reg [MSG_LEN_B1 - 1:0] message_block1;//384/512
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            message_block <= 'd0;
            message_block1 <= 'd0;
//            valid_out <= 1'b0;
        end else if (valid) begin
            // 首先添加一个1比特
            message_block[MAX_MSG_LEN] <= 1'b1;
            message_block[MAX_MSG_LEN-1:0] <= message;
            // 然后添加0比特直到长度模512等于448
            for ( i = MAX_MSG_LEN+1; i < MSG_LEN_B-64; i = i + 1) begin
                message_block[i] <= 1'b0;
            end
            // 最后添加64位的原始消息长度
            message_block[MSG_LEN_B-1:MSG_LEN_B-64] <= MAX_MSG_LEN;
            
            
            message_block1[MAX_MSG_LEN] = 1'b1;
            message_block1[MAX_MSG_LEN-1:0] = message;
            for ( i = MAX_MSG_LEN+1; i < MSG_LEN_B1-128; i = i + 1) begin
                message_block1[i] = 1'b0;
            end
            message_block1[MSG_LEN_B1-1:MSG_LEN_B1-128] = MAX_MSG_LEN;

        end else begin
            message_block <= 'd0;
            message_block1 <= 'd0;
        end
    end
    
    data_sp #(
        .WIDTH(512),
        .BLOCK2_SIZE(512),
        .BLOCK3_SIZE(1088)
    )u1_data_sp(
        .clk(clk),
        .rst_n(rst_n),
        .valid(valid),
        .data(message_block),
        .data_o1(message_block_o),
        .data_o2()
        
    );
    
    
    

//`ifdef SHA2_224
sha2_224 #(
    .MAX_MSG_LEN(MSG_LEN_B)
    )sha2_224(
        .clk            (clk          ),
        .rst_n          (rst_n        ),
        .message_block  (message_block_o),            // 
        .valid          (valid        ),
        .digest         (digest_224       ),            //224
        .done           (         )
    );
    
//    `elsif SHA2_256
    sha2_256 #(
    .MAX_MSG_LEN(MSG_LEN_B)
    )sha2_256(
        .clk            (clk          ),
        .rst_n          (rst_n        ),
        .message_block  (message_block_o),            // 
        .valid          (valid        ),
        .digest         (digest_256       ),            //256
        .done           (done         )
    );
    
//    `elsif SHA2_384
    sha2_384 #(
    .MAX_MSG_LEN(MSG_LEN_B1)
    )sha2_384(
        .clk            (clk          ),
        .rst_n          (rst_n        ),
        .message_block  (message_block1),            // 
        .valid          (valid        ),
        .digest         (digest_384       ),            //384
        .done           (         )
    );
    
//    `elsif SHA2_512
    sha2_512 #(
    .MAX_MSG_LEN(MSG_LEN_B1)
    )sha2_512(
        .clk            (clk          ),
        .rst_n          (rst_n        ),
        .message_block  (message_block1),            // 
        .valid          (valid        ),
        .digest         (digest_512       ),            //512
        .valid_out      (valid_out    )
    );
//    `endif

endmodule